const jwt = require('jsonwebtoken');
const dotenv = require('dotenv');
dotenv.config();

/**
 * 认证工具类
 * 提供JWT token生成、验证和中间件功能
 */
class AuthService {
  constructor() {
    this.jwtSecret = process.env.JWT_SECRET;
    this.jwtExpiresIn = process.env.JWT_EXPIRES_IN;
  }

  /**
   * 生成JWT token
   * @param {object} payload - token载荷数据
   * @param {string} expiresIn - 过期时间，默认为环境变量配置的值
   * @returns {string} - 生成的token字符串
   */
  generateToken(payload, expiresIn = this.jwtExpiresIn) {
    return jwt.sign(payload, this.jwtSecret, { expiresIn });
  }

  /**
   * 验证JWT token
   * @param {string} token - 要验证的token
   * @returns {object|null} - 验证成功返回token载荷，失败返回null
   */
  verifyToken(token) {
    try {
      return jwt.verify(token, this.jwtSecret);
    } catch (error) {
      console.error('Token验证失败:', error.message);
      return null;
    }
  }

  /**
   * 从请求头中提取token
   * @param {object} req - Express请求对象
   * @returns {string|null} - token字符串或null
   */
  extractTokenFromHeader(req) {
    const authHeader = req.headers.authorization;
    if (!authHeader) return null;
    
    // Bearer token格式
    if (authHeader.startsWith('Bearer ')) {
      return authHeader.substring(7);
    }
    return null;
  }

  /**
   * 认证中间件
   * @param {object} req - Express请求对象
   * @param {object} res - Express响应对象
   * @param {function} next - 下一个中间件
   */
  authMiddleware(req, res, next) {
    try {
      const token = this.extractTokenFromHeader(req);
      if (!token) {
        return res.status(401).json({
          code: 401,
          message: '未提供认证token',
          data: null
        });
      }

      const decoded = this.verifyToken(token);
      if (!decoded) {
        return res.status(401).json({
          code: 401,
          message: '无效的认证token',
          data: null
        });
      }

      // 将用户信息存储到请求对象中
      req.user = decoded;
      next();
    } catch (error) {
      res.status(500).json({
        code: 500,
        message: '认证过程中发生错误',
        data: null
      });
    }
  }

  /**
   * 管理员权限中间件
   * @param {object} req - Express请求对象
   * @param {object} res - Express响应对象
   * @param {function} next - 下一个中间件
   */
  adminMiddleware(req, res, next) {
    if (!req.user || req.user.role !== 'admin') {
      return res.status(403).json({
        code: 403,
        message: '需要管理员权限',
        data: null
      });
    }
    next();
  }
}

// 导出AuthService实例
const authService = new AuthService();

// 保持向后兼容，导出单独的函数
module.exports = {
  generateToken: authService.generateToken.bind(authService),
  verifyToken: authService.verifyToken.bind(authService),
  extractTokenFromHeader: authService.extractTokenFromHeader.bind(authService),
  authMiddleware: authService.authMiddleware.bind(authService),
  adminMiddleware: authService.adminMiddleware.bind(authService)
};

// 也导出类本身，以便将来可能的扩展
module.exports.AuthService = AuthService;